#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char const *argv[])
{
    int *arr = NULL; // 初始指针为空
    size_t capacity = 0; // 当前容量
    size_t size = 0; // 已使用的大小
 
    // 假设初始需求为5个整数的空间
    arr = (int *)malloc(5 * sizeof(int)); // 使用 malloc 分配初始内存
    if (NULL==arr) { // 检查是否成功分配
        printf("内存分配失败\n");
        return 0;
    }
    capacity = 5;
 
    // 初始化数组中的值
    for (size_t i = 0; i < capacity; ++i) {
        arr[i] = i + 1;
    }
 
    // 打印原始数组内容
    printf("原始数组内容:\n");
    for (size_t i = 0; i < capacity; ++i) {
        printf("%d\t", arr[i]);
    }
    printf("\n");
 
    // 需要扩展到新的容量(翻倍)
    size_t new_capacity = capacity*2;
    printf("容量从 %ld 扩容到 %ld \n", capacity, new_capacity);
 
    // 分配新的更大的内存区域
    int *new_arr = (int *)malloc(new_capacity * sizeof(int));
    if (NULL==new_arr) { // 如果失败，则退出程序
        perror("内存分配失败");
        free(arr); // 确保释放原内存以防泄漏
        return 0;
    }
 
    // 将现有数据从旧内存复制到新内存
    memcpy(new_arr, arr, capacity * sizeof(int));
 
    // 清理旧的内存资源
    free(arr);
    arr = new_arr; // 更新指针指向新的内存地址
    capacity = new_capacity; // 更新当前容量
 
    // 给新增加的部分赋初值
    for (size_t i = capacity - (capacity - size); i < capacity; ++i) {
        arr[i] = i + 1;
    }
 
    // 打印扩增后的数组内容
    printf("扩容后的数组:\n");
    for (size_t i = 0; i < capacity; ++i) {
        printf("%d\t", arr[i]);
    }
    printf("\n");
 
    // 最终清理工作
    free(arr);
    arr = NULL;
 
    return 0;
}